/* 
 * File:   Thread.h
 * Author: mm021791
 *
 * Created on 17 de octubre de 2012, 14:41
 */

#ifndef THREAD_H
#define	THREAD_H

#include <cstdlib>
#include <pthread.h>
#include <errno.h>
#include "common_Excepcion.h"

using namespace std;
using namespace TP;

namespace TP { namespace Threading { 

    class Thread {

    public:

        Thread();

        virtual ~Thread();
        
        int ID ();
        
        virtual void Iniciar() throw (Excepcion&);
        
        virtual void Finalizar() throw (Excepcion&);
        
    protected:
        
        virtual void tarea () = 0;
        
        void Ocupar();
        
        void Liberar();
        
        void lock();
        
        void unlock();
        
    private:
        
        bool Activo ();
        
        void Activar();
                
        void Desactivar ();
        
        bool Trabajando();

        void* correr (void* pArgs);
        
        static void* correr_helper (void* contexto){
            return ((Thread*)contexto)->correr(contexto);
        }        
        
        pthread_t thread;
        bool activo;
        bool trabajando;
        
    };
}}


#endif	/* THREAD_H */

